#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<string>
#include<cstring>
#include<thread>
#include<ctime>
#define NUM 10
using namespace std;
int tickets=10000;
pthread_mutex_t mutex;
void *threadRoutine(void*name)
{
    string tname=static_cast<const char*>(name);
    while (true)
    {
        pthread_mutex_lock(&mutex);
        if(tickets>0)
       {
            usleep(2000);
            cout<<tname<<"get a ticket:"<<tickets--<<endl;
            pthread_mutex_unlock(&mutex);
        }
        else 
        {
            pthread_mutex_unlock(&mutex);
            break;
        }
        usleep(1000);
    }
    return nullptr;
}
int main()
{
    pthread_mutex_init(&mutex,nullptr);
    pthread_t t[4];
    int n=sizeof(t)/sizeof(t[0]);
    for(int i=0;i<n;i++)
    {
        char*data=new char[64];
        snprintf(data,64,"thread-%d",i+1);
        pthread_create(t+i,nullptr,threadRoutine,data);
    }

    for(int i=0;i<n;i++)
    {
        pthread_join(t[i],nullptr);
    }
    pthread_mutex_destroy(&mutex);
    return 0;
}

// __thread int g_val=100;
// // void run1()
// // {
// //     while(true)
// //     {
// //         cout<<"thread 1"<<endl;
// //         sleep(1);
// //     }
// // }
// // void run2()
// // {
// //     while(true)
// //     {
// //         cout<<"thread 2"<<endl;
// //         sleep(1);
// //     }
// // }
// // void run3()
// // {
// //     while(true)
// //     {
// //         cout<<"thread 3"<<endl;
// //         sleep(1);
// //     }
// // }
// // int main()
// // {
// //     thread the1(run1);
// //     thread the2(run2);
// //     thread the3(run3);

// //     the1.join();
// //     the2.join();
// //     the3.join();
// //     return 0;
// // } 
// string hexAddr(pthread_t tid)
// {
//     char buffer[24];
//     snprintf(buffer,sizeof(buffer),"0x%x",tid);
//     return buffer;
// }
// void *thread_run(void *args)
// {
//     // char*name=(char*)args;
//     // while(true)
//     // {
//     //     cout<<"new thread running:"<<name<<endl;
//     //     sleep(1);
//     //     break;
//     // }
//     // delete name;
//     // pthread_exit((void*)1);
//     //return nullptr;

//     string name=static_cast<const char*>(args);
//     int cnt=5;
//     while(cnt)
//     {
//         // cout<<name<<":"<<cnt--<<hexAddr(pthread_self())<<endl;
//         cout<<name<<" g_val:"<<g_val++<<" &g_val:"<<&g_val<<endl;
//         sleep(1);
//     }
//     // pthread_exit((void*)11);
//     return nullptr;
// }
// int main()
// {
//     pthread_t t1,t2,t3;
//     pthread_create(&t1,nullptr,thread_run,(void*)"thread 1");
//     pthread_create(&t2,nullptr,thread_run,(void*)"thread 2");
//     pthread_create(&t3,nullptr,thread_run,(void*)"thread 3");
//     pthread_join(t1,nullptr);
//     pthread_join(t2,nullptr);
//     pthread_join(t3,nullptr);

//     // while(true)
//     // {
//     //     cout<<"main thread:"<<hexAddr(pthread_self())<<" "<<"new thread id:"<<hexAddr(tid)<<endl;
//     //     sleep(1);
//     // }

//     // int n=pthread_join(tid,nullptr);
//     // if(0!=n)
//     // {
//     //     cerr<<"error:"<<n<<":"<<strerror(n)<<endl;
//     // }

//     // void *ret=nullptr;
//     // pthread_join(tid,&ret);
//     // cout<<"new thread exit:"<<(int64_t)ret<<endl;
//     return 0;
// }
